iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

昨天介紹了 RabbitMQ的基本概念以及幾種應用模式,如果想要於 Spring Boot 中使用 RabbitMQ 並實作 RabbitMQ 中的幾種應用模式,需先完成以下配置:

Step 1. 於 pom.xml 內加入 RabbitMQ 的依賴項目

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
    <version><!-- 請自行選擇適用版本 --></version>
</dependency>

Spring AMQP 是由 Spring 框架提供的一個項目,用於基於AMQP的訊息傳遞方案的開發。Spring AMQP 中提供了一個模組,幫助開發人員更輕鬆的實現訊息的發送、接收等行為。

Step 2. 於 application.properties 內設定 RabbitMQ Server 的連接方式

spring.rabbitmq.host = localhost
spring.rabbitmq.port = 5672
spring.rabbitmq.username = guest
spring.rabbitmq.password = guest 

在 Spring Boot 專案中連接 RabbitMQ Server 時使用的 port 為 5672(這是AMQP默認的通訊埠號)。

Step 3. 建立一個RabbitMQ相關設定的類別

@Configuration
public class RabbitmqConfig {

    private final static String QUEUE_NAME = "testQueue";

    @Bean
    public Queue testQueue(){
        return new Queue(QUEUE_NAME);
    }
    
}

@Configuration註解用於標註此類別為Spring的配置類,裡面包含一個或多個使用@Bean 註解的方法,用於定義指定的訊息佇列(Queue)、交換器(Exchange),並將他們納入Spring IoC 容器內進行管理。

實作範例
在完成一系列設定後,先建立一個發送訊息的類別如下:

@Component
public class Sender {

    @Autowired
    private RabbitTemplate rabbitmqTemplate;

    public void sendQueue(String message) {
    
        rabbitmqTemplate.convertAndSend("testQueue", message);
        
    }

}

RabbitTemplate 類別內提供了許多的方法用來發送和接收訊息,例如範例中的 convertAndSend 方法就是負責發送訊息的方法。

接著我們可以在 @Server 類別下建立一個監聽訊息的方法如下:

@RabbitListener(queues = "testQueue")
public void processMessage(String message) {

    logger.info("Get a message !!");
    
    System.out.println(" [X] Received '" + message + "'");
    
}

@RabbitListener 是一個用於監聽指定Queue的註解,當收到訊息(message)時,會主動呼叫方法處理收到的訊息。

可以寫一個簡單的測試類用於測試訊息的發送和接收,測試程式如下:

@SpringBootTest
@ExtendWith(MockitoExtension.class)
class RabbitmqTest {

    @Autowired
    private Sender sender;

    @Test
    public void simpleTest(){

        sender.sendQueue("Hello World !!");

    }

}

上一篇
Day26 - Spring Boot 整合 RabbitMQ(上)
下一篇
Day28 - Spring Boot 整合 Redis(上)
系列文
這些年SpringBoot實戰開發教會我的事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言